package com.lcc.lynx.jdbc;

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.lcc.lynx.common.exception.e.JDBCException;
import com.lcc.lynx.common.utils.AssertUtil;
import com.lcc.lynx.jdbc.pojo.TablePojo;
import com.lcc.lynx.jdbc.pojo.PageParams;
import com.lcc.lynx.jdbc.util.JDBCReflectUtil;
import com.lcc.lynx.jdbc.util.PageUtil;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

/**
 * service基础服务类
 *
 * @param <DV>
 */
public interface IBaseService<DV extends TablePojo> {


    /**
     * 获取操作Mapper
     *
     * @return
     */
    IBaseMapper<DV> getMapper();

    /**
     * 获取批量插入的批次大小
     *
     * @return
     * @author lcc
     * @date 2025/7/23 10:23
     */
    default Integer getInsertBatchSize() {
        return 10;
    }

    /**
     * 查询全部
     *
     * @param dv
     * @return
     */
    default List<DV> select(DV dv) {
        return getMapper().select(dv);
    }

    /**
     * 分页查询
     *
     * @param dv
     * @param pageParams
     * @return
     */
    default PageInfo<DV> selectPage(DV dv, PageParams pageParams) {
        return PageUtil.page(dv, pageParams, this::select);
    }

    /**
     * 查询一个
     *
     * @param dv
     * @return
     */
    default DV selectOne(DV dv) {
        AssertUtil.isFalse(JDBCReflectUtil.ifAllEmpty(dv), "selectOne: 查询无有效参数");
        PageHelper.startPage(1, 2, false);
        List<DV> list = this.select(dv);
        if (list.size() > 1) {
            throw new JDBCException("selectOne: 查询结果大于1条");
        }
        return list.isEmpty() ? null : list.get(0);
    }

    /**
     * 插入一个
     *
     * @param dv
     * @return
     */
    @Transactional(rollbackFor = Exception.class)
    default int insert(DV dv) {
        AssertUtil.isNotNull(dv, "insert: 插入对象不能为空");
        return insertList(List.of(dv));
    }

    /**
     * 批量插入，十条一批的插入
     *
     * @param list
     * @return
     */
    @Transactional(rollbackFor = Exception.class)
    default int insertList(List<DV> list) {
        AssertUtil.isNotNull(list, "insertList: 插入列表不能为null");
        if(list.isEmpty()){
            return 0;
        }
        JDBCReflectUtil.checkInsertRequired(list.get(0));
        // 每十条一批的执行
        for (int i = 0; i < list.size(); i += getInsertBatchSize()) {
            getMapper().insert(list.subList(i, Math.min(i + getInsertBatchSize(), list.size())));
        }
        return list.size();
    }

    /**
     * 更新一个
     *
     * @param set 更新哪些字段
     * @param wr  更新的条件
     * @return
     */
    @Transactional(rollbackFor = Exception.class)
    default int update(DV set, DV wr) {
        AssertUtil.isFalse(JDBCReflectUtil.ifAllEmpty(wr), "update: 更新无有效参数");
        wr.setUpdateObj(set);
        return getMapper().update(wr);
    }


    /**
     * 删除
     *
     * @param dv 删除条件
     * @return
     */
    @Transactional(rollbackFor = Exception.class)
    default int delete(DV dv) {
        AssertUtil.isFalse(JDBCReflectUtil.ifAllEmpty(dv), "delete: 删除无有效参数");
        return getMapper().delete(dv);
    }

}
